/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年8月10日
 * 项目： rainhy-config
 */
package com.rainhy.config.manager;

import com.rainhy.config.config.ConfigProperty;
import com.rainhy.config.context.ConfigManager;
import com.rainhy.core.util.AssertUtils;

/**
 * 配置属性代理类
 * 
 * @author rain
 * @version [版本号, 2016年8月10日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class ConfigPropertyProxy implements ConfigProperty {
    
    /** 配置管理器 */
    private ConfigManager manager;
    
    /** 配置内容 */
    private ConfigContextParse localConfigContextParse;
    
    /** 配置组 */
    private ConfigGroupParse configGroupParse;
    
    /** 配置属性 */
    private ConfigPropertyParse configPropertyParse;
    
    public ConfigPropertyProxy(
            ConfigManager manager,
            ConfigContextParse localConfigContextParse,
            ConfigGroupParse configGroupParse,
            ConfigPropertyParse configPropertyParse) {
        super();
        //        AssertUtils.notNull(configGroupParse, "[配置组]不能为 null");   // 当顶级属性,就没有分组
        AssertUtils.notNull(manager, "[配置管理器]不能为 null");
        AssertUtils.notNull(localConfigContextParse, "[配置内容]不能为 null");
        AssertUtils.notNull(configPropertyParse, "[配置属性]不能为 null");
        this.manager = manager;
        this.localConfigContextParse = localConfigContextParse;
        this.configGroupParse = configGroupParse;
        this.configPropertyParse = configPropertyParse;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ConfigPropertyProxy other = (ConfigPropertyProxy) obj;
        if (getKey() == null) {
            if (other.getKey() != null)
                return false;
        } else if (!getKey().equals(other.getKey()))
            return false;
        return true;
    }
    
    @Override
    public String getDescription() {
        return this.configPropertyParse.getDescription();
    }
    
    @Override
    public String getGroupName() {
        return this.configGroupParse == null ? null : configGroupParse.getName();
    }
    
    @Override
    public String getKey() {
        return this.configPropertyParse.getKey();
    }
    
    @Override
    public String getName() {
        return this.configPropertyParse.getName();
    }
    
    @Override
    public String getValue() {
        return this.configPropertyParse.getValue();
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getKey() == null) ? 0 : getKey().hashCode());
        return result;
    }
    
    @Override
    public boolean isEditAble() {
        return this.manager.isSupportEditAble();
    }
    
    @Override
    public boolean isViewAble() {
        ///// 最优先判断所在配置内容是否可显示
        boolean viewAble = this.localConfigContextParse.isViewAble();
        if (viewAble) {
            ///// 其次判断所在配置分组是否可显示
            if (this.configGroupParse != null && !this.configGroupParse.isViewAble()) {
                return false;   // 所在组不能显示,则组以下的属性全部不能显示
            }
            return this.configPropertyParse.isViewAble();
        }
        return false;
    }
    
    @Override
    public String toString() {
        return getKey() + "(" + getName() + ") = " + getValue() + "]";
    }
    
    @Override
    public void update(String value) {
        this.manager.updateConfigProperty(getKey(), value);
    }
}
